package com.cysoft.starter.log.core.helper;


/**
 * @author 玖零
 * @version v0.0.1
 * @project cysoft-spring-boot-starter-log
 * @package com.cysoft.starter.log.core.helper
 * @date 2025-02-04 23:49
 * @desc 字符串模式匹配帮助类
 */
public class PatternMatcherHelper {

    /**
     * 判断目标字符串是否与模式字符串匹配。
     * 模式字符串中可以包含 '*' 和 '?' 通配符，其中 '*' 可以匹配任意长度的任意字符序列，'?' 可以匹配任意单个字符。
     *
     * @param targetString 待匹配的目标字符串
     * @param patternString 包含通配符的模式字符串
     * @return 如果目标字符串与模式字符串匹配，则返回 true；否则返回 false
     */
    public static boolean isMatch(String targetString, String patternString) {
        // 目标字符串的当前索引位置
        int targetIndex = 0;
        // 模式字符串的当前索引位置
        int patternIndex = 0;
        // 记录遇到 '*' 通配符时，目标字符串的索引位置，用于回溯
        int targetBacktrackIndex = -1;
        // 记录遇到 '*' 通配符时，模式字符串的索引位置，用于回溯
        int patternBacktrackIndex = -1;

        // 遍历目标字符串
        while (targetIndex < targetString.length()) {
            if (patternIndex < patternString.length() && patternString.charAt(patternIndex) == '*') {
                // 遇到 '*' 通配符，记录当前位置，以便后续回溯
                targetBacktrackIndex = targetIndex;
                patternBacktrackIndex = patternIndex;
                // 模式字符串指针后移，跳过 '*'
                patternIndex++;
            } else if (patternIndex < patternString.length() && (targetString.charAt(targetIndex) == patternString.charAt(patternIndex) || patternString.charAt(patternIndex) == '?')) {
                // 当前字符匹配成功（字符相等或模式字符为 '?'），两个指针都后移
                targetIndex++;
                patternIndex++;
            } else {
                // 当前字符匹配失败，检查是否之前遇到过 '*' 通配符
                if (patternBacktrackIndex == -1) {
                    // 没有遇到过 '*' 通配符，匹配失败
                    return false;
                }
                // 回溯到之前遇到 '*' 通配符的位置
                patternIndex = patternBacktrackIndex;
                // 目标字符串指针回到记录位置并后移一位
                targetIndex = targetBacktrackIndex + 1;
                // 更新记录的目标字符串位置
                targetBacktrackIndex = targetIndex;
            }
        }

        // 当目标字符串遍历完后，检查模式字符串中剩余的字符
        while (patternIndex < patternString.length() && patternString.charAt(patternIndex) == '*') {
            // 如果剩余字符都是 '*'，则跳过
            patternIndex++;
        }

        // 检查模式字符串是否也遍历完，遍历完则匹配成功
        return patternIndex == patternString.length();
    }

}
